package com.chapter7.neibulei.demo4;


/**
 *
 * 内部类:
 * 用于存储字符串，并提供字符串的迭代功能。
 *
 *
 * 当内部类与接口组合在一起使用的时候，就能真正展现内部类的实用性了。
 * 让内部类实现一个接口，然后通过接口变量来引用这个内部类的实例，于是不用再和内部类的名称打交道，更重要的是可以屏蔽内部类的实现细节
 */
public class StringHolder {
    private String[] values;
    private int pos;

    public StringHolder(int length) {
        values = new String[length];
        pos=0;
    }

    public void  put (String val){
        values[pos++] = val;
    }

    public String get(int index){
        return values[index];
    }


    /**
     *  1) iterator方法，返回类型是Iterator接口类型;
     *  2) 方法内部创建了一个内部类StringIterator的对象，并返回它。
     *  3) 该对象会被向上转型为接口类型。当需要使用这个内部类的实例时，调用外部类对象的iterator方法，
     *     并通过Iterator接口类型的变量来引用该对象即可，就像代码中“Iterator it= sh.iterator（）；”
     * 这样就不需要与内部类的名称打交道了。既然不需要直接访问内部类，为了更好地屏蔽内部类的实现细节，
     * 我们将该类声明为private，如同外部类的其他私有成员一样，我们将无法在外部类之外访问这个内部类。
     * @return
     */
    public Iterator iterator(){
        return new StringIterator();
    }


    //内部类实现了Iterator接口，声明为private
    private class StringIterator implements Iterator{
        private  int ipos = 0 ;

        @Override
        public boolean hashNext() {
            return ipos<values.length;
        }

        @Override
        public String next() {
            return values[ipos++];
        }
    }

    public static void main(String[] args) {
        StringHolder sh = new StringHolder(10);
        for (int i=0;i<10;i++){
            sh.put(((Integer)(i*3)).toString());
        }
        Iterator it = sh.iterator();
        while (it.hashNext()){
            System.out.println(it.next());
            System.out.println("");
        }
    }























}
